#pragma once

#include "ws.packer.h"

#include <map>

namespace TOB {
  namespace WS {
    
    class Assembler {
    private:
      Assembler();
      static Assembler* _self;
      
      std::map<int, TOB::WS::Packer*> _buffer;
    public:
      /**
       * Получить инстанцию одиночки
       * @return указатель на объект
       */
      static Assembler* getInstance();
      /**
       * Оператор обращения к определенному упаковщику в общем буфере
       * @param token однозначный номер упаковщика
       * @return указатель на упаковщик
       */
      TOB::WS::Packer* operator [](int token);
      /**
       * Установка новой ссылки в запись по токену
       * @param packer указатель на новый упаковщик
       * @param token однозначный номер упаковщика
       */
      void setLinkPackerByToken(TOB::WS::Packer* packer, int token);
      /**
       * Создание нового упаковщика и ячейки
       * @return номер созданной ячейки
       */
      int newPacker();
      /**
       * Проверка существования определенного упаковщика
       * @param token номер ячейки
       */
      bool existPacker(int token);
      
      void erase(std::map<int, TOB::WS::Packer*>::iterator it);
      std::map<int, TOB::WS::Packer*>::iterator find(int token);
    };
  }
}
